package com.tedu.api.ee;

import org.junit.Test;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;

/**
 * Java有一套完善异常处理操作：
 * 程序中对应出现什么问题，就会有对应异常【对象】提供出来，错误也是对象！
 *
 * Throwable顶级超类--抛出错误：
 *          子类：Exception对象：程序级别的错误（经常遇见）
 *          编译期--FileOutputStream(编写代码同时，下方波浪线)
 *          处理方式①：抛出异常：不管什么错误，抛出方法外
 *                ②：捕获异常：抓到异常，记录异常错误
 *          检查异常：通常由编译器检查出来，存在异常类，抛出、捕获！
 *
 *          运行期--控制台（IDE开发工具控制台，显示出红色，异常类名字）
 *          非检查异常：RuntimeException(认为所有异常来自于RuntimeException)
 *                    所有异常都是RuntimeException的子类！
 *
 *
 *          子类：Error对象：描述系统级别的错误（不常见）
 *          ----测试：程序挂了？ 字符串
 *          String str="字符串"; 直接量写出字符串 ---存常量池
 */
public class EE {
    /**
     * Error错误---递归方式栈溢出
     * 1.创建静态方法method
     * 2.在静态方法中调用method
     * 3.通过testError单元测试--调用EE对象下的method方法
     */
    public static void method(){
        method();
    }

    @Test
    public void testError(){
        EE.method();
    /* String name="jett";
     for(int i=0;i<9999999999999L;i++){
     name=name+"1";*/
    }
    //Exception 检查异常  --处理手段2：捕获方式---预判：程序出什么异常

    /**
     * 捕获异常语法：
     *           try{
     *               可能出现的异常代码段中添加
     *           }catch（异常名字【小异常】 e）{
     *               e.printStackTrace（）；打印异常信息--
     *                                    方便开发者查询原因
     *           }catch（异常名字【中异常】 e）{
     *            e.printStackTrace（）；
     *            }catch（异常名字【大异常】 e）{
     *            e.printStackTrace（）；
     *            }finally{
     *                捕获异常---必须执行代码块--IO关闭流
     *            }
     *  捕获异常快捷键:ctrl+alt+t  选中可能出现错误代码块
     *
     */
    @Test
    public void testException(){

        try {
            String s="a";
            //StringIndexOutOfBoundsException异常--字符串下标越界异常

            //异常产生原因：指定下标超出字符串范围！
            s.charAt(0);

            //NullPointerException异常---空指针异常
            //异常异常原因：字符串为空，拿到数据值为空时
            s.length();

            //NumberFormatException异常---数值转换异常
            //异常产生原因：将存储的不是整数的字符串，转换为整数！
            Integer.parseInt(s); //a 是整数类型
        } catch (NumberFormatException e) {//数值转换异常
            e.printStackTrace();//打印异常信息--提供线索·
        } catch (NullPointerException e) {//空指针异常
            e.printStackTrace();//打印异常信息--提供线索·
        } catch (StringIndexOutOfBoundsException e) {//下标越界异常
            e.printStackTrace();//打印异常信息--提供线索·
        } finally {
            System.out.println("一直执行代码块");
        }
    }

//练习：写出代码段五个错误【分开：一次抓一个错误】，使用try--catch捕获打印信息
//提示：字符串、集合、标准IO、包装类--看API

public class Main0 {
    public void main(String[] args) throws FileNotFoundException {
        String st = "Like";
        char ch = st.charAt(4);

        String str = null;
        System.out.println(str.length());

        Object obj = "Like";
        int n = (int) obj;

        Object []arrays=new String[3];
        arrays[0]="";
        arrays[1]=new Integer(567);
        arrays[2]=new Double(4567);

        }
}



    @Test
    public void test123() {
        try {
            int i = 6 / 0;
            System.out.println(i);
        } catch (ArithmeticException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println("输出");
        }
    }
}
